# 导入所需的库
import cv2  # 计算机视觉库，用于图像处理
import imutils  # 图像处理的辅助功能库，简化OpenCV函数的使用
import numpy as np  # 数组操作库，用于矩阵和数组运算
import pytesseract  # OCR库，用于识别图像中的文字

# 设置Tesseract可执行文件的路径
pytesseract.pytesseract.tesseract_cmd = r'D:\pycharm\tess\tesseract.exe'

# 读取彩色图像，并调整大小
img = cv2.imread(r'D:\pics\lplate\s.jpg', cv2.IMREAD_COLOR)  # 读取彩色图像
img = cv2.resize(img, (600, 400))  # 调整图像大小为600x400

# 转换为灰度图像，并应用双边滤波器以减少噪声
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 将图像转换为灰度图
gray = cv2.bilateralFilter(gray, 13, 15, 15)  # 应用双边滤波器以减少噪声

# 检测图像边缘
edged = cv2.Canny(gray, 30, 200)  # 使用Canny算法检测图像边缘

# 查找轮廓
contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 查找边缘的轮廓
contours = imutils.grab_contours(contours)  # 提取轮廓
# 按照轮廓面积排序，并只保留前10个
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]  # 只保留前10个最大轮廓
screenCnt = None  # 初始化车牌轮廓变量

# 遍历轮廓，寻找具有四个顶点的轮廓
for c in contours:
    peri = cv2.arcLength(c, True)  # 计算轮廓的周长
    approx = cv2.approxPolyDP(c, 0.018 * peri, True)  # 多边形拟合
    if len(approx) == 4:  # 如果拟合的多边形有四个顶点
        screenCnt = approx  # 认为找到了车牌
        break  # 找到后退出循环

# 如果没有检测到四个顶点的轮廓，打印提示信息
if screenCnt is None:
    detected = 0
    print("No contour detected")  # 输出未检测到轮廓的提示信息
else:
    detected = 1

# 如果检测到车牌轮廓，绘制轮廓
if detected == 1:
    cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)  # 绘制红色轮廓

# 创建掩码并提取车牌区域
mask = np.zeros(gray.shape, np.
                uint8)  # 创建与灰度图像相同大小的黑色掩码
new_image = cv2.drawContours(mask, [screenCnt], 0, 255, -1)  # 在掩码上绘制轮廓
new_image = cv2.bitwise_and(img, img, mask=mask)  # 通过掩码提取车牌区域

# 提取车牌的最小和最大坐标
(x, y) = np.where(mask == 255)  # 找到掩码中值为255的像素位置
(topx, topy) = (np.min(x), np.min(y))  # 找到上边界
(bottomx, bottomy) = (np.max(x), np.max(y))  # 找到下边界
Cropped = gray[topx:bottomx + 1, topy:bottomy + 1]  # 裁剪出车牌区域

# 使用pytesseract进行OCR识别车牌号码
# 使用pytesseract进行OCR识别车牌号码，指定使用中文和英文识别
text = pytesseract.image_to_string(Cropped, config='--psm 11', lang='chi_sim+eng')  # 结合中文和英文识别
print("车牌号码是:", text)  # 打印识别出的车牌号码

# text = pytesseract.image_to_string(Cropped, config='--psm 11')  # 识别车牌中的文字
# print("车牌号码是:", text)  # 打印识别出的车牌号码

# 调整图像大小并显示
img = cv2.resize(img, (500, 300))  # 调整原始图像大小以便显示
Cropped = cv2.resize(Cropped, (400, 200))  # 调整裁剪后的图像大小以便显示
cv2.imshow('car', img)  # 显示原始图像
cv2.imshow('Cropped', Cropped)  # 显示车牌区域
cv2.waitKey(0)  # 等待用户按键
cv2.destroyAllWindows()  # 关闭所有OpenCV窗口
